home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / lib / posix / getgrent.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  2KB  |  134 lines

  1. /* get entry from group file
  2.  *
  3.  * By: Patrick van Kleef
  4.  *
  5.  * James R. Stuhlmacher   Nov 1989
  6.  *  - Added group members.
  7.  *  - Modified for POSIX conformance.
  8.  */
  9.  
  10. #include <lib.h>
  11. #include <sys/stat.h>
  12. #include <fcntl.h>
  13. #include <grp.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <unistd.h>
  17.  
  18. #define GRBUFSIZE  256
  19. #define BUFFERSIZE 1024
  20. #define GRMEMMAX  32
  21.  
  22. PRIVATE char _gr_file[] = "/etc/group";
  23. PRIVATE char _grbuf[GRBUFSIZE];
  24. PRIVATE char _buffer[BUFFERSIZE];
  25. PRIVATE char *_grmem[GRMEMMAX + 1];
  26. PRIVATE char *_pnt;
  27. PRIVATE char *_buf;
  28. PRIVATE int _gfd = -1;
  29. PRIVATE int _bufcnt;
  30. PRIVATE struct group _grp;
  31.  
  32. PRIVATE _PROTOTYPE( int getline, (void));
  33. PRIVATE _PROTOTYPE( void skip_period, (int c));
  34.  
  35. PUBLIC int setgrent()
  36. {
  37.   if (_gfd >= 0)
  38.     lseek(_gfd, (off_t) 0, SEEK_SET);
  39.   else
  40.     _gfd = open(_gr_file, O_RDONLY);
  41.  
  42.   _bufcnt = 0;
  43.   return(_gfd);
  44. }
  45.  
  46.  
  47. PUBLIC void endgrent()
  48. {
  49.   if (_gfd >= 0) close(_gfd);
  50.  
  51.   _gfd = -1;
  52.   _bufcnt = 0;
  53. }
  54.  
  55.  
  56. PRIVATE int getline()
  57. {
  58.   if (_gfd < 0 && setgrent() < 0) return(0);
  59.  
  60.   _buf = _grbuf;
  61.   do {
  62.     if (--_bufcnt <= 0) {
  63.         if ((_bufcnt = read(_gfd, _buffer, BUFFERSIZE)) <= 0)
  64.             return(0);
  65.         else
  66.             _pnt = _buffer;
  67.     }
  68.     *_buf++ = *_pnt++;
  69.   } while (*_pnt != '\n' && _buf < _grbuf + GRBUFSIZE - 1);
  70.   _pnt++;
  71.   _bufcnt--;
  72.   *_buf = '\0';
  73.   _buf = _grbuf;
  74.   return(1);
  75. }
  76.  
  77. PRIVATE void skip_period(c)
  78. char c;
  79. {
  80.   while ((*_buf) && (*_buf != c)) _buf++;
  81.   if (*_buf) *_buf++ = '\0';
  82. }
  83.  
  84. PUBLIC struct group *getgrent()
  85. {
  86.   char **_grmem_ptr;
  87.  
  88.   if (getline() == 0) return((struct group *)NULL);
  89.  
  90.   _grp.gr_name = _buf;
  91.   skip_period(':');
  92.   skip_period(':');        /* gr_passwd is not in POSIX */
  93.   _grp.gr_gid = (gid_t) atoi(_buf);
  94.   skip_period(':');
  95.   _grp.gr_mem = _grmem;
  96.   _grmem_ptr = _grmem;
  97.   while ((*_buf) && _grmem_ptr < _grmem + GRMEMMAX) {
  98.     *_grmem_ptr++ = _buf;
  99.     skip_period(',');
  100.   }
  101.   *_grmem_ptr = (char *)NULL;
  102.   return(&_grp);
  103. }
  104.  
  105. struct group *getgrnam(name)
  106. char *name;
  107. {
  108.   struct group *grp;
  109.  
  110.   setgrent();
  111.   while ((grp = getgrent()) != 0)
  112.     if (!strcmp(grp->gr_name, name)) break;
  113.   endgrent();
  114.   if (grp != 0)
  115.     return(grp);
  116.   else
  117.     return((struct group *)NULL);
  118. }
  119.  
  120. struct group *getgrgid(gid)
  121. gid_t gid;
  122. {
  123.   struct group *grp;
  124.  
  125.   setgrent();
  126.   while ((grp = getgrent()) != 0)
  127.     if (grp->gr_gid == gid) break;
  128.   endgrent();
  129.   if (grp != 0)
  130.     return(grp);
  131.   else
  132.     return((struct group *)NULL);
  133. }
  134.